//package com.info.zhiduoduo.pay.service;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.mapper.Condition;
//import com.info.zhiduoduo.common.configs.KltPayConfig;
//import com.info.zhiduoduo.common.constants.Constants;
//import com.info.zhiduoduo.common.constants.SmartResult;
//import com.info.zhiduoduo.common.constants.StatusMsg;
//import com.info.zhiduoduo.common.constants.pay.PayAccount;
//import com.info.zhiduoduo.common.formbean.BaseListFormBean;
//import com.info.zhiduoduo.common.formbean.BaseSimpleFormBean;
//import com.info.zhiduoduo.common.utils.DateUtil;
//import com.info.zhiduoduo.common.utils.LogUtil;
//import com.info.zhiduoduo.pay.dto.QueryResultDto;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.Head;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.BatchPayContent;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.BatchPayRequest;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.BatchPayResult;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.PayContent;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.PayRequest;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.payment.PayResult;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.BatchQueryContent;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.BatchQueryRequest;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.BatchQueryResult;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.QueryContent;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.QueryRequest;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.model.querypay.QueryResult;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.util.HttpUtils;
//import com.info.zhiduoduo.pay.sdk.kltongpaysdk.util.SignUtils;
//import com.info.zhiduoduo.repository.dto.account.BatchQueryResultDto;
//import com.info.zhiduoduo.repository.entity.company.Company;
//import com.info.zhiduoduo.repository.entity.company.CompanyAccount;
//import com.info.zhiduoduo.repository.entity.quota.CityConfig;
//import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceProject;
//import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceTradeRecord;
//import com.info.zhiduoduo.repository.entity.crowdsource.CrowdsourceTradeRecordItem;
//
//import org.apache.commons.lang3.tuple.ImmutablePair;
//import org.apache.commons.lang3.tuple.Pair;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.StringUtils;
//
//import java.math.BigDecimal;
//import java.math.RoundingMode;
//import java.util.Arrays;
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * 开联通 支付工具
// *
// * @author bob
// * @since 2019/1/15 上午11:17
// */
//@Service
//public class KltBatchPayService {
//
//	@Autowired
//	KltPayConfig kltPayConfig;
//
//	/**
//	 * 批量实时代付
//	 *
//	 * @param formBean 交易记录
//	 * @return
//	 */
//	public SmartResult batchPay(BaseListFormBean<CrowdsourceTradeRecordItem> formBean) {
//
//		List<CrowdsourceTradeRecordItem> tradeList = formBean.getReqdata();
//		if (CollectionUtils.isEmpty(tradeList)) return SmartResult.ofErrorParam();
//
//		//支付记录,检查是否已存在还未处理好的支付记录.如果有,等待支付结果即可，不需要再调用支付接口。
//		//支付创建中,处理中和处理成功,表示不需要再新建了.直接返回
//		/*int recordProcessing = new TradeRecord().selectCount(Condition.create()
//				.eq("projectid", trade.getProjectid())
//				.eq("idtype", UserType.MAKER)
//				.in("tradestate", Arrays.asList(Constants.TRADE_CREATE, Constants.TRADE_IN_PROCESS)));
//		if (recordProcessing > 0) {
//			return returnValue(StateMsg.StatusMsg_448);
//		}
//		int recordSuccess = new TradeRecord().selectCount(Condition.create()
//				.eq("projectid", trade.getProjectid())
//				.eq("idtype", trade.getProjectid())
//				.eq("tradestate", Constants.TRADE_SUCCESS));
//		if (recordSuccess > 0) {
//			return returnValue(StateMsg.StatusMsg_449);
//		}*/
//
//		String merchantid = "";
//		String md5key = "";
//		if (StringUtils.isEmpty(merchantid)) {
//			Integer projectid = tradeList.get(0).getProjectid();
//			Pair<String, String> pair = getCrowdsourceCityMerchant(projectid);
//			if (pair != null) {
//				// 使用智众包设置的特定城市的商户号
//				merchantid = pair.getLeft();
//				md5key = pair.getRight();
//			} else {
//				//使用九歌账户支付
//				merchantid = kltPayConfig.getMerchantId();
//				md5key = kltPayConfig.getMd5Key();
//			}
//
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("merchantid", merchantid));
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			md5key = account.getMd5key();
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType("1");
//
//		List<BatchPayContent> contentList = tradeList.stream().map(trade -> {
//
//			String bankNo = trade.getAccttype() == 2 ? trade.getBankno() : "000000000000";
//
//			return new BatchPayContent().setMchtBatchNo(trade.getBatchNo())
//					.setMchtOrderNo(trade.getTradeNo())
//					.setAccountName(trade.getAcctname())
//					.setAccountNo(trade.getAcctno())
//					.setAmt(trade.getTradeamount().multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN).toString())
//					.setAccountType(trade.getAccttype() + "")
//					.setBankName(trade.getBankname())
//					.setBankNo(bankNo)
//					.setOrderDateTime(DateUtil.getStringDate(trade.getTradetime(), DateUtil.FORMAT_STYLE_7))
//					.setPurpose(trade.getPurpose())
//					.setNotifyUrl(kltPayConfig.getPayNotifyUrl());
//		}).collect(Collectors.toList());
//
//		return payInternal(md5key, head, contentList);
//	}
//
//	private SmartResult payInternal(String md5key, Head head, List<BatchPayContent> contentList) {
//		BatchPayRequest request = new BatchPayRequest();
//		request.setHead(head);
//		request.setContent(contentList);
//
//		JSONObject jsonObject = (JSONObject) JSONObject.toJSON(request);
//		String originSign = jsonObject.toJSONString();
//		LogUtil.info("支付请求参数, 签名前:" + originSign);
//		LogUtil.info("md5key=" + md5key);
//		//添加签名
//		String signStr = SignUtils.addArraySign(originSign, md5key);
//		LogUtil.info("签名后,请求参数:" + signStr);
//		//忽略SSL认证
//		String respJsonStr = null;
//		try {
//			respJsonStr = HttpUtils.sendHttpPostRequest(kltPayConfig.getBatchPayUrl(), signStr, false);
//		} catch (Exception e) {
//			e.printStackTrace();
//			return SmartResult.fail(e.getMessage());
//		}
//
//		LogUtil.info("调用代付 返回:" + respJsonStr);
//		BatchPayResult result = JSON.parseObject(respJsonStr, BatchPayResult.class);
//		if (result == null || !"000000".equals(result.getResponseCode())) {
//			SmartResult smartResult = SmartResult.fail(StatusMsg.StatusMsg_445);
//			smartResult.setObject(result);
//			return smartResult;
//		}
//		return SmartResult.success(result);
//	}
//
//	/**
//	 * 批量代付查询
//	 *
//	 * @param formBean
//	 */
//	public SmartResult queryBatchPay(BaseSimpleFormBean<Integer> formBean) {
//
//		Integer batchId = formBean.getReqdata();
//		CrowdsourceTradeRecord trade = new CrowdsourceTradeRecord().selectById(batchId);
//
//		if (trade == null) {
//			return SmartResult.ofErrorParam();
//		}
//
//		String merchantid = trade.getMerchantid();
//		String md5key = "";
//		if (StringUtils.isEmpty(merchantid)) {
//			Integer projectid = trade.getProjectid();
//			Pair<String, String> pair = getCrowdsourceCityMerchant(projectid);
//			if (pair != null) {
//				// 使用智众包设置的特定城市的商户号
//				merchantid = pair.getLeft();
//				md5key = pair.getRight();
//			} else {
//				//使用九歌账户支付
//				merchantid = kltPayConfig.getMerchantId();
//				md5key = kltPayConfig.getMd5Key();
//			}
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("merchantid", merchantid));
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			md5key = account.getMd5key();
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType("1");
//		BatchQueryContent content = new BatchQueryContent(trade.getBatchNo());
//		return queryInternal(md5key, head, content);
//	}
//
//	private SmartResult queryInternal(String md5key, Head head, BatchQueryContent content) {
//		BatchQueryRequest request = new BatchQueryRequest();
//		request.setHead(head);
//		request.setContent(content);
//
//		JSONObject jsonObject = (JSONObject) JSONObject.toJSON(request);
//		String originSign = jsonObject.toJSONString();
//		//添加签名
//		String signStr = SignUtils.addSign(originSign, md5key);
//		//忽略SSL认证
//		String respJsonStr = null;
//		try {
//			respJsonStr = HttpUtils.sendHttpPostRequest(kltPayConfig.getBatchQueryUrl(), signStr, false);
//		} catch (Exception e) {
//			e.printStackTrace();
//			return SmartResult.fail(e.getMessage());
//		}
//
//		LogUtil.info("查询单笔代付返回:" + respJsonStr);
//		BatchQueryResult result = JSON.parseObject(respJsonStr, BatchQueryResult.class);
//		if (result == null || !"000000".equals(result.getResponseCode())) {
//			return SmartResult.fail(StatusMsg.StatusMsg_445);
//		}
//		BatchQueryResultDto resultDto = new BatchQueryResultDto();
//		BeanUtils.copyProperties(result, resultDto);
//
//		return SmartResult.success(resultDto);
//	}
//
//	/**
//	 * 批量支付的单笔重新支付
//	 *
//	 * @param formBean 交易记录
//	 * @return
//	 */
//	public SmartResult repayBatchItem(BaseSimpleFormBean<CrowdsourceTradeRecordItem> formBean) {
//
//		CrowdsourceTradeRecordItem trade = formBean.getReqdata();
//
//		LogUtil.info("trade = " + trade);
//		if (trade == null) return SmartResult.ofErrorParam();
//
//		//支付记录,检查是否已存在还未处理好的支付记录.如果有,等待支付结果即可，不需要再调用支付接口。
//		//支付创建中,处理中和处理成功,表示不需要再新建了.直接返回
//		int recordProcessing = new CrowdsourceTradeRecordItem().selectCount(Condition.create()
//				.eq("project_item_id", trade.getProjectItemId())
//				.in("status", Arrays.asList(Constants.CROWDSOURCE_BATCH_ITEM_CREATED, Constants.CROWDSOURCE_BATCH_ITEM_PAYING)));
//		if (recordProcessing > 0) {
//			return SmartResult.fail(StatusMsg.StatusMsg_448);
//		}
//		int recordSuccess = new CrowdsourceTradeRecordItem().selectCount(
//				Condition.create().eq("project_item_id", trade.getProjectItemId()).eq("status", Constants.CROWDSOURCE_BATCH_ITEM_PAID));
//		if (recordSuccess > 0) {
//			return SmartResult.fail(StatusMsg.StatusMsg_449);
//		}
//
//		CrowdsourceTradeRecord tradeRecord = new CrowdsourceTradeRecord().selectById(trade.getBatchId());
//		if (tradeRecord == null) return SmartResult.fail(StatusMsg.StatusMsg_444);
//
//		Integer payAccount = tradeRecord.getPayAccount();
//		String merchantid;
//		String md5key = "";
//		if (payAccount == PayAccount.DAYS_JIUGE) {
//			Integer projectid = trade.getProjectid();
//			Pair<String, String> pair = getCrowdsourceCityMerchant(projectid);
//			if (pair != null) {
//				// 使用智众包设置的特定城市的商户号
//				merchantid = pair.getLeft();
//				md5key = pair.getRight();
//			} else {
//				//使用九歌账户支付
//				merchantid = kltPayConfig.getMerchantId();
//				md5key = kltPayConfig.getMd5Key();
//			}
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("compid", tradeRecord.getCompid()));
//			merchantid = account.getMerchantid();
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			md5key = account.getMd5key();
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType("1");
//
//		String bankNo = trade.getAccttype() == 2 ? trade.getBankno() : "000000000000";
//
//		PayContent content = new PayContent().setAccountName(trade.getAcctname())
//				.setAccountNo(trade.getAcctno())
//				.setAmt(trade.getTradeamount().multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN).toString())
//				.setAccountType(trade.getAccttype() + "")
//				.setBankName(trade.getBankname())
//				.setBankNo(bankNo)
//				.setMchtOrderNo(trade.getTradeNo())
//				.setOrderDateTime(DateUtil.getStringDate(trade.getTradetime(), DateUtil.FORMAT_STYLE_7))
//				.setPurpose(trade.getPurpose())
//				.setNotifyUrl(kltPayConfig.getPayNotifyUrl());
//
//		return repayInternal(md5key, head, content);
//	}
//
//	private SmartResult repayInternal(String md5key, Head head, PayContent content) {
//		PayRequest request = new PayRequest();
//		request.setHead(head);
//		request.setContent(content);
//
//		JSONObject jsonObject = (JSONObject) JSONObject.toJSON(request);
//		String originSign = jsonObject.toJSONString();
//		LogUtil.info("支付请求参数, 签名前:" + originSign);
//		LogUtil.info("md5key=" + md5key);
//		//添加签名
//		String signStr = SignUtils.addSign(originSign, md5key);
//		LogUtil.info("签名后,请求参数:" + signStr);
//		//忽略SSL认证
//		String respJsonStr = null;
//		try {
//			respJsonStr = HttpUtils.sendHttpPostRequest(kltPayConfig.getPayUrl(), signStr, false);
//		} catch (Exception e) {
//			e.printStackTrace();
//			return SmartResult.fail(e.getMessage());
//		}
//
//		LogUtil.info("调用代付 返回:" + respJsonStr);
//		PayResult result = JSON.parseObject(respJsonStr, PayResult.class);
//		if (result == null || !"000000".equals(result.getResponseCode())) {
//			SmartResult smartResult = SmartResult.fail(StatusMsg.StatusMsg_445);
//			smartResult.setObject(result);
//			return smartResult;
//		}
//		return SmartResult.success(result);
//	}
//
//	/**
//	 * 单笔明细重新支付 查询代付结果
//	 *
//	 * @param formBean
//	 */
//	public SmartResult queryItemRepay(BaseSimpleFormBean<Integer> formBean) {
//
//		Integer tradeItemId = formBean.getReqdata();
//		CrowdsourceTradeRecordItem tradeItem = new CrowdsourceTradeRecordItem().selectById(tradeItemId);
//		if (tradeItem == null) return SmartResult.ofErrorParam();
//
//		CrowdsourceTradeRecord tradeRecord = new CrowdsourceTradeRecord().selectById(tradeItem.getBatchId());
//		Integer payAccount = tradeRecord.getPayAccount();
//		String merchantid = tradeRecord.getMerchantid();
//		String md5key = "";
//		if (payAccount == PayAccount.DAYS_JIUGE) {
//			Integer projectid = tradeItem.getProjectid();
//			Pair<String, String> pair = getCrowdsourceCityMerchant(projectid);
//			if (pair != null) {
//				// 使用智众包设置的特定城市的商户号
//				merchantid = pair.getLeft();
//				md5key = pair.getRight();
//			} else {
//				//使用九歌账户支付
//				merchantid = kltPayConfig.getMerchantId();
//				md5key = kltPayConfig.getMd5Key();
//			}
//		} else {
//			//使用企业自己的开联通账户支付
//			CompanyAccount account = new CompanyAccount().selectOne(Condition.create().eq("merchantid", merchantid));
//			merchantid = account.getMerchantid();
//			if (account == null) return SmartResult.fail(StatusMsg.StatusMsg_302);
//			md5key = account.getMd5key();
//		}
//
//		//参数
//		Head head = new Head();
//		head.setMerchantId(merchantid);
//		head.setSignType("1");
//
//		QueryContent content = new QueryContent().setMchtOrderNo(tradeItem.getTradeNo())
//				.setOrderDate(DateUtil.getStringDate(tradeItem.getTradetime(), DateUtil.FORMAT_STYLE_5))
//				.setPaymentBusinessType(QueryContent.SINGLE_PAY);
//
//		return queryInternal(md5key, head, content);
//	}
//
//	private SmartResult queryInternal(String md5key, Head head, QueryContent content) {
//		QueryRequest request = new QueryRequest();
//		request.setHead(head);
//		request.setContent(content);
//
//		JSONObject jsonObject = (JSONObject) JSONObject.toJSON(request);
//		String originSign = jsonObject.toJSONString();
//		//添加签名
//		String signStr = SignUtils.addSign(originSign, md5key);
//		//忽略SSL认证
//		String respJsonStr = null;
//		try {
//			respJsonStr = HttpUtils.sendHttpPostRequest(kltPayConfig.getQueryUrl(), signStr, false);
//		} catch (Exception e) {
//			e.printStackTrace();
//			return SmartResult.fail(e.getMessage());
//		}
//
//		LogUtil.info("查询单笔代付返回:" + respJsonStr);
//		QueryResult result = JSON.parseObject(respJsonStr, QueryResult.class);
//		if (result == null || !"000000".equals(result.getResponseCode())) {
//			return SmartResult.fail(StatusMsg.StatusMsg_445);
//		}
//		QueryResultDto resultDto = new QueryResultDto();
//		BeanUtils.copyProperties(result, resultDto);
//
//		return SmartResult.success(resultDto);
//	}
//
//	private Pair<String, String> getCrowdsourceCityMerchant(int projectid) {
//		CrowdsourceProject project = new CrowdsourceProject().selectById(projectid);
//		if (project == null) return null;
//
//		Integer compid = project.getCompid();
//		Company company = new Company().selectById(compid);
//		CityConfig cityConfig = new CityConfig().selectById(company.getCrowdsourceCity());
//		if (cityConfig == null) return null;
//
//		return new ImmutablePair<>(cityConfig.getCsMerchantid(), cityConfig.getCsMd5key());
//
//	}
//}
